package com.plant.classify.util;

import com.plant.classify.mapper.ClassifyMapper;
import com.plant.classify.vo.DetailVo;
import com.plant.classify.vo.OrderInsert;
import com.plant.classify.vo.OrderVo;
import com.plant.common.utils.IdWorker;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

@Component
public class CartServiceUtil {

    private final RedisTemplate redisTemplate;
    @Autowired
    private ClassifyMapper classifyMapper;

    public CartServiceUtil(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    /**
     * 查找购物车中是否存在相同商品的索引
     * 根据商品 ID 和价格判断商品是否相同
     *
     * @param existingOrders 购物车中已存在的商品列表
     * @param newOrder       待添加的新商品信息
     * @return 相同商品的索引，如果不存在则返回 -1
     */
    public int findDuplicateIndex(List<OrderVo> existingOrders, OrderVo newOrder) {
        for (int i = 0; i < existingOrders.size(); i++) {
            OrderVo order = existingOrders.get(i);
            if (order.getSid() == newOrder.getSid() && order.getPrice().equals(newOrder.getPrice())) {
                return i;
            }
        }
        return -1;
    }


    /**
     * 向购物车中添加新商品
     * 为新商品生成唯一 ID，并将其添加到 Redis 的购物车列表中
     *
     * @param orderVo 待添加的新商品信息
     * @param idWorker ID 生成器，用于为新商品生成唯一 ID
     */
    public void addNewOrder(OrderVo orderVo, IdWorker idWorker) {
        orderVo.setOrderId(String.valueOf(idWorker.nextId()));
        redisTemplate.opsForList().rightPush("toCart" + orderVo.getUid(), orderVo);
    }


    /**
     * 订单提交
     * @param orderInsert
     */
    public void OrderSave(OrderInsert orderInsert) {
        // 设置订单时间为当前时间
        orderInsert.setOrderTime(LocalDateTime.now());
        // 保存订单信息
        saveOrder(orderInsert);
        // 处理订单详情
        handleOrderDetails(orderInsert);
    }


    /**
     * 保存订单
     * @param orderInsert
     */
    public void saveOrder(OrderInsert orderInsert) {
        redisTemplate.opsForValue().set("oid" + orderInsert.getUid(), orderInsert.getOrderId());
        classifyMapper.orderDetail(orderInsert);
    }

    /**
     * 处理订单详情
     *
     * @param orderInsert 订单插入对象，包含订单详情信息
     */
    public void handleOrderDetails(OrderInsert orderInsert) {
        // 获取产品ID数组
        Integer[] productIds = orderInsert.getIds();
        // 检查产品ID是否不为空
        if (productIds != null) {
            // 从Redis中获取购物车列表
            List<OrderVo> cartList = redisTemplate.opsForList().range("toCart" + orderInsert.getUid(), 0, -1);
            // 获取订单ID数组
            String[] orderIds = orderInsert.getOrderIds();
            // 遍历购物车列表
            for (OrderVo orderVo : cartList) {
                // 遍历订单ID数组
                for (String orderId : orderIds) {
                    // 检查当前购物车项的订单ID是否在订单ID数组中
                    if (orderVo.getOrderId().equals(orderId)) {
                        // 从Redis的购物车列表中移除相应的订单项
                        redisTemplate.opsForList().remove("toCart" + orderInsert.getUid(), 0, orderVo);
                    }
                }
            }
            // 遍历产品ID数组
            for (Integer id : productIds) {
                // 创建详情对象
                DetailVo detailVo = new DetailVo();
                // 将订单插入对象的属性复制到详情对象
                BeanUtils.copyProperties(orderInsert, detailVo);
                // 设置店铺ID
                detailVo.setShopId(id);
                // 插入详情数据到数据库
                classifyMapper.InsertDetail(detailVo);
            }
        } else {
            // 创建详情对象
            DetailVo detailVo = new DetailVo();
            // 将订单插入对象的属性复制到详情对象
            BeanUtils.copyProperties(orderInsert, detailVo);
            // 插入详情数据到数据库
            classifyMapper.InsertDetail(detailVo);
        }
    }
}
